//==========================================================
// Logger.cpp
//
// Implantation de la classe ILogger
//
//==========================================================


//==========================================================
// En-têtes
//==========================================================
#include "Logger.hpp"
#include "Exceptions.hpp"
#include <ctime>
#include <cstdarg>

//==========================================================
// Constantes
//==========================================================
#define DEFAULT_BUFFER_SIZE 1024
	
namespace Tools
{

// Instance
ILogger::TLoggerMap ILogger::loggerMap;

////////////////////////////////////////////////////////////
// Constructeur
////////////////////////////////////////////////////////////
ILogger::ILogger( std::string name )
{
	loggerName = name;
}

////////////////////////////////////////////////////////////
// Destructeur
////////////////////////////////////////////////////////////
ILogger::~ILogger()
{

}

////////////////////////////////////////////////////////////
// Accesseur sur le nom du logger
////////////////////////////////////////////////////////////
std::string ILogger::GetName()
{
	return loggerName;
}

////////////////////////////////////////////////////////////
// Ajoute un logger
////////////////////////////////////////////////////////////
void ILogger::AddLogger(ILogger * logger )
{	
	Assert(logger != NULL );
	loggerMap[logger->GetName()] = logger;
}
        

////////////////////////////////////////////////////////////
// Supprime tous les loggers
////////////////////////////////////////////////////////////
void ILogger::DeleteLoggers()
{	
	TLoggerMap::iterator it;
	for( it = loggerMap.begin(); it != loggerMap.end(); it++ )
	{
		delete it->second;
	}
	
	loggerMap.clear();	
}

////////////////////////////////////////////////////////////
// Recherche l'instance du logger
////////////////////////////////////////////////////////////
ILogger * ILogger::GetLogger( std::string name )
{
	ILogger * logger = NULL;
		
	// Recherche de l'existance du logger
	TLoggerMap::iterator it;
	it = loggerMap.find(name);
	Assert(it != loggerMap.end());
   	logger = it->second;		        
    	return logger;
}


////////////////////////////////////////////////////////////
// Détruit l'instance du logger
//
////////////////////////////////////////////////////////////
void ILogger::Destroy()
{
}

////////////////////////////////////////////////////////////
// Log un message
//
// [in] sFormat : Format du message à logger
// [in] ... :     Paramètres optionnels
//
////////////////////////////////////////////////////////////
void ILogger::Info(const char* Format, ...)
{
    // Formatage du message dans une chaîne de caractère
    char sBuffer[DEFAULT_BUFFER_SIZE];
    va_list Params;
    va_start(Params, Format);
    vsprintf(sBuffer, Format, Params);
    va_end(Params);

    // Loggization
    Write("[INFO] : "  + loggerName  +  " - "  ); 
   	Write(sBuffer);
}

void ILogger::Warning(const char* Format, ...)
{
    // Formatage du message dans une chaîne de caractère
    char sBuffer[DEFAULT_BUFFER_SIZE];
    va_list Params;
    va_start(Params, Format);
    vsprintf(sBuffer, Format, Params);
    va_end(Params);

    // Loggization
    Write( "[WARNING] : "  + loggerName  +  " - " );
    Write(sBuffer);
}

void ILogger::Severe(const char* Format, ...)
{
    // Formatage du message dans une chaîne de caractère
    char sBuffer[DEFAULT_BUFFER_SIZE];
    va_list Params;
    va_start(Params, Format);
    vsprintf(sBuffer, Format, Params);
    va_end(Params);

    // Loggization
    Write("[SEVERE] : " + loggerName  +  " - " );
    Write(sBuffer);    
}


////////////////////////////////////////////////////////////
// Renvoie la date courante
//
// [retval] Date courante sous forme de chaîne de caractères
//
////////////////////////////////////////////////////////////
std::string ILogger::CurrentDate() const
{
    // Récupération et formatage de la date
    char sTime[24];
    time_t CurrentTime = time(NULL);
    strftime(sTime, sizeof(sTime), "%d/%m/%Y", localtime(&CurrentTime));

    return sTime;
}


////////////////////////////////////////////////////////////
// Renvoie l'heure courante
//
// [retval] Heure courante sous forme de chaîne de caractères
//
////////////////////////////////////////////////////////////
std::string ILogger::CurrentTime() const
{
    // Récupération et formatage de la date
    char sTime[24];
    time_t CurrentTime = time(NULL);
    strftime(sTime, sizeof(sTime), "%H:%M:%S", localtime(&CurrentTime));

    return sTime;
}

} // namespace Tools
